package com.vic.mybatisplus02;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.File;
import java.util.Collections;

/**
 *
 * @author victor
 */
public class CodeGenerator {

    // 数据库连接信息
    private static final String URL = "jdbc:mysql://10.61.100.78:3307/mybatis-plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    /**
     * 生成代码的输出目录，这里默认类路径下的 src/test/java/com/vic/mybatisplus02 包下，即当前工程的test目录下。
     * user.dir 值为 /Users/renliwo/gitee/mybatis-plus
     */
    private static final String JAVA_OUTPUT_DIR = System.getProperty("user.dir") + File.separator + "mybatisplus02/src/main/java/";

    /**
     * mapper xml 输出的目录
     */
    private static final String MAPPER_XML_OUTPUT_DIR = System.getProperty("user.dir") + File.separator + "mybatisplus02/src/main/resources/mapper";


    public static void main(String[] args) {

        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("victor") // 设置作者
                            .fileOverride() // 开启 fileOverride 覆盖旧文件
                            .disableOpenDir() // 禁用代码生成后打开输出目录对话框
                            .dateType(DateType.TIME_PACK)
                            .outputDir(JAVA_OUTPUT_DIR); // 指定生成代码的输出目录
                })
                // 包配置
                // parent 指定生成的代码在哪个包下，entity可以指定实体所在的包名
                .packageConfig(builder ->
                    // 父包名
                    builder.parent("com.vic.pms")
                            // 模块名
//                            .moduleName("user")
                            // 实体包名
                            .entity("entity")
                            // service 接口包名
                            .service("service")
                            .serviceImpl("service.impl")
                            // mapper类包名
                            .mapper("mapper")
                            // mapper xml 包名
//                            .xml("mapper.xml")
                            // 自定义文件包名
//                            .other("xx")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, MAPPER_XML_OUTPUT_DIR))
                )
                // 策略配置
                .strategyConfig(builder ->
                        // 设置需要生成代码的表名，不调用该方法默认为所有表生成代码。
                        builder
                                .addInclude("sys_access_log")

                                // addTablePrefix可以过滤表前缀，即u_user变成user
//                                .addTablePrefix("u_")

                                // service 配置
                                .serviceBuilder().formatServiceFileName("%sService")

                                // controller 配置
                                .controllerBuilder()
                                // 开启生成@RestController控制器
                                .enableRestStyle()

                                // entity 配置
                                .entityBuilder()
//                                .disableSerialVersionUID()
                                .enableLombok()

                                // mapper 配置
                                // formatMapperFileName格式化Mapper接口名称，即t_user -> UserMapper
                                // formatXmlFileName格式化Mapper.xml文件名称，即t_user -> UserMapper.xml
                                .mapperBuilder().formatMapperFileName("%sMapper").formatXmlFileName("%sMapper")
                                .enableBaseColumnList().enableBaseResultMap().enableBaseColumnList()
                                .build()
                )
                // MyBatis-Plus代码生成器是通过模板引擎来渲染文件的，默认模板引擎是Velocity，根据依赖我们使用Freemarker
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

}
